// utils/auth.js
/**
 * 认证工具类
 * 处理微信登录、用户信息和认证状态
 */

const http = require('./http');
const config = require('../config');

// 存储键名常量
const STORAGE_KEYS = {
  TOKEN: 'token',
  USER_INFO: 'userInfo'
};

/**
 * 检查登录状态
 * @returns {boolean} 是否已登录
 */
const checkLoginStatus = () => {
  const token = wx.getStorageSync(STORAGE_KEYS.TOKEN);
  const userInfo = wx.getStorageSync(STORAGE_KEYS.USER_INFO);
  return !!(token && userInfo);
};

/**
 * 获取用户信息
 * @returns {Object|null} 用户信息
 */
const getUserInfo = () => {
  const userInfo = wx.getStorageSync(STORAGE_KEYS.USER_INFO);
  console.log('auth.js - 获取到的用户信息:', userInfo);
  return userInfo || null;
};

/**
 * 保存登录信息
 * @param {string} token - 登录令牌
 * @param {Object} userInfo - 用户信息
 */
const saveLoginInfo = (token, userInfo) => {
  wx.setStorageSync(STORAGE_KEYS.TOKEN, token);
  wx.setStorageSync(STORAGE_KEYS.USER_INFO, userInfo);
};

/**
 * 获取用户资料
 * @returns {Promise<Object>} 用户资料Promise
 */
const getUserProfile = () => {
  return new Promise((resolve, reject) => {
    wx.getUserProfile({
      desc: '用于完善会员资料',
      success: (profileRes) => {
        resolve(profileRes.userInfo);
      },
      fail: (err) => {
        reject(new Error(`获取用户信息失败: ${err.errMsg}`));
      }
    });
  });
};

/**
 * 获取微信登录凭证
 * @returns {Promise<string>} 登录凭证code
 */
const getWxLoginCode = () => {
  return new Promise((resolve, reject) => {
    wx.login({
      success: (loginRes) => {
        if (loginRes.code) {
          console.log('微信登录生成的code:', loginRes.code);
          resolve(loginRes.code);
        } else {
          reject(new Error(`登录失败: ${loginRes.errMsg}`));
        }
      },
      fail: (err) => {
        reject(new Error(`登录失败: ${err.errMsg}`));
      }
    });
  });
};

/**
 * 验证后端返回数据格式
 * @param {Object} res - 后端返回数据
 * @returns {Object} 验证后的数据
 */
const validateLoginResponse = (res) => {
  console.log('登录接口返回数据:', res);
  
  if (!res.data || !res.data.token || !res.data.userInfo) {
    throw new Error('登录返回数据格式不正确');
  }
  
  return res.data;
};

/**
 * 微信登录
 * @returns {Promise<Object>} Promise对象
 */
const wxLogin = async () => {
  try {
    console.log('开始微信登录...');
    
    // 获取用户资料
    const userInfo = await getUserProfile();
    
    // 获取登录凭证
    const code = await getWxLoginCode();
    
    // 发送登录请求
    const response = await http.post(config.API.WECHAT_LOGIN, {
      code,
      userInfo
    });
    
    // 验证返回数据
    const loginData = validateLoginResponse(response);
    
    // 保存登录信息
    saveLoginInfo(loginData.token, loginData.userInfo);
    
    return {
      token: loginData.token,
      userInfo: loginData.userInfo
    };
  } catch (error) {
    console.error('微信登录失败:', error);
    throw new Error(`微信登录失败: ${error.message}`);
  }
};

/**
 * 账号密码登录
 * @param {string} username - 用户名
 * @param {string} password - 密码
 * @returns {Promise<Object>} Promise对象
 */
const accountLogin = async (username, password) => {
  try {
    const response = await http.post(config.API.ACCOUNT_LOGIN, {
      username,
      password
    });
    
    if (!response.token || !response.userInfo) {
      throw new Error('登录返回数据格式不正确');
    }
    
    // 保存登录信息
    saveLoginInfo(response.token, response.userInfo);
    
    return {
      token: response.token,
      userInfo: response.userInfo
    };
  } catch (error) {
    console.error('账号登录失败:', error);
    throw new Error(`账号登录失败: ${error.message}`);
  }
};

/**
 * 退出登录
 */
const logout = () => {
  // 清除本地存储的登录信息
  wx.removeStorageSync(STORAGE_KEYS.TOKEN);
  wx.removeStorageSync(STORAGE_KEYS.USER_INFO);
};

/**
 * 更新用户信息
 * @param {Object} userInfo - 用户信息
 * @returns {Promise<Object>} Promise对象
 */
const updateUserInfo = async (userInfo) => {
  try {
    const response = await http.put(config.API.UPDATE_USER_INFO, userInfo);
    
    // 更新本地存储的用户信息
    const oldUserInfo = getUserInfo() || {};
    const newUserInfo = { ...oldUserInfo, ...userInfo };
    wx.setStorageSync(STORAGE_KEYS.USER_INFO, newUserInfo);
    
    return newUserInfo;
  } catch (error) {
    console.error('更新用户信息失败:', error);
    throw error;
  }
};

module.exports = {
  checkLoginStatus,
  getUserInfo,
  wxLogin,
  accountLogin,
  logout,
  updateUserInfo,
  saveLoginInfo
};
